package com.ch04.controller;

import com.ch04.entity.User;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;

/**
 * @ClassName UserController
 * @Description TODO
 * @Author Kx
 * @Date 2025/5/12 15:37
 * @Version 1.0
 */
// 标识为控制层
@Controller
/**
 * 可以使用@RequestMapping标注在类上,用来设置请求的命名空间(区分路径前缀)
 * @RequestMapping("/user")
 * 意思就是如果想要文件此类中的某个方法需要加上/user/方法实际路径
*/
public class UserController {
    /**
     * 使用@RequestMapping映射请求路径,method属性设置可以支持的请求方法;如POST、GET等
     * 从3.2版本开始使用语义更明确的映射注解
     * 如：@PostMapping、@GetMapping、@PutMapping等注解来对应不同的请求方法
     *
     *
     * 当数据绑定时，方法参数的名和请求的参数名保持一致就可以自动映射转换，但是需要注意：方法参数名需要编译到字节码中
     * 或者使用@RequestParam注解映射请求参数
    */
    // @RequestMapping(value = "/add",method = {RequestMethod.POST,RequestMethod.GET})
    @PostMapping("/add") // 指定明确的post请求方式
    public String add(@RequestParam("username") String userName,@RequestParam("age") int age,@RequestParam("phones") String[] tels) { // 映射请求参数
        System.out.println(userName);
        System.out.println(age);
        System.out.println(Arrays.toString(tels));
        return "hello";
    }

    // @InitBinder注解用于注册WebDataBinder,用于Web数据绑定
    @InitBinder
    /**
     * @author: kx
     * @date: 2025/5/12 19:48
     * @param binder
     * @return void
     * @description: 注册自定义转换器 : 此自定义转换器只能在当前类使用,如果希望整个项目使用,则在Mvc配置类中设置全局日期转换器
     * 使用@InitBinder注解标注的方法会在执行当前Controller类的任意方法前执行,通过传入的WebDataBinder参数来设置日期的格式化,这样springmvc会根据指定的日期格式来转换
    */
    public void regFormatter(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }

    @PostMapping("/add2")
    public String add(User user) {
        System.out.println(user.getUsername());
        System.out.println(user.getAge());
        System.out.println(user.getBirthday());
        user.getPhones().forEach(System.out::println);
        System.out.println(user.getIdCard().getCardNum());
        user.getAddresses().forEach(address -> System.out.println(address.getCity() + ":" + address.getStreet()));

        return "hello";
    }

    /**
     * @author: kx
     * @date: 2025/5/12 19:41
     * @param user : 用户对象
     * @return java.lang.String
     * @description: 当请求参数是JSON字符串时
     * 如: "{
     *     "username" : "user",
     *     "age" : "18",
     *     ...
     * }"
     * 必须使用@RequestBody映射
    */
    @PostMapping("/add3")
    public String add3(@RequestBody User user) {
        System.out.println(user.getUsername());
        return "hello";
    }
    /**
     * @author: kx
     * @date: 2025/5/12 19:52
     * @param id : 用户编号
     * @return java.lang.String
     * @description: 路径参数映射
    */
    @GetMapping("/user/{uid}")
    public String findUser(@PathVariable("uid") int id) {
        System.out.println(id);
        return "hello";
    }
}
